package ar.com.larreta.persistencia;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.SimpleExpression;

import com.extjs.gxt.ui.client.data.BaseBooleanFilterConfig;
import com.extjs.gxt.ui.client.data.BaseDateFilterConfig;
import com.extjs.gxt.ui.client.data.BaseFilterConfig;
import com.extjs.gxt.ui.client.data.BaseNumericFilterConfig;
import com.extjs.gxt.ui.client.data.BaseStringFilterConfig;


public class HerramientasDao {

	public static String ASC = "ASC";
	public static String DESC = "DESC";
	
	private static HerramientasDao instancia;
	
	public Map<Class, AdaptadorFiltros> adaptadores;
	
	private HerramientasDao(){
		adaptadores = new HashMap<Class, AdaptadorFiltros>();
		adaptadores.put(BaseBooleanFilterConfig.class, new AdaptadorBaseBooleanFilterConfig());
		adaptadores.put(BaseDateFilterConfig.class, new AdaptadorBaseDateFilterConfig());
		adaptadores.put(BaseNumericFilterConfig.class, new AdaptadorBaseNumericFilterConfig());
		adaptadores.put(BaseStringFilterConfig.class, new AdaptadorBaseStringFilterConfig());
	};
	
	public static HerramientasDao getInstancia(){
		if (instancia==null){
			instancia = new HerramientasDao();
		}
		return instancia;
	}
	
	/**
	 * Retorna un adaptador para el tipo de filtro pasado por parametro
	 * @param clase
	 * @return
	 */
	public AdaptadorFiltros getAdaptador(Class clase){
		return adaptadores.get(clase);
	}
	
	/**
	 * Transforma filtros de la vista en expresiones validas de hibernate
	 * @param filtros
	 * @return
	 */
	public List<SimpleExpression> getExpresiones(List<BaseFilterConfig> filtros){
		List<SimpleExpression> restrictions = null;
		if (filtros != null) {
			restrictions = new ArrayList<SimpleExpression>();
			Iterator<BaseFilterConfig> it = filtros.iterator();
			while (it.hasNext()) {
				BaseFilterConfig filtro = it.next();
				restrictions.add(getAdaptador(filtro.getClass()).obtenerRestriccion(filtro));
			}
		}
		return restrictions;
	}	
	
	/**
	 * Retorna un orden especifico para un campo
	 * @param direccionOrden
	 * @param campoOrden
	 * @return
	 */
	public static Order ordenar(String direccionOrden, String campoOrden){
		if ((direccionOrden==null) || (campoOrden==null)){
			return null;
		}
		if (ASC.equalsIgnoreCase(direccionOrden)){
			return Order.asc(campoOrden);
		}
		return Order.desc(campoOrden);
	}

	
}
